﻿using System;
using Validate.Net.Core;

namespace Validate.Net.Internals.Regulars
{
    /// <summary>
    /// 属性只能是电子邮箱
    /// </summary>
    public sealed class EmailAttribute : ValidateRegexBaseAttribute
    {
        /// <summary>
        /// 属性只能是电子邮箱
        /// </summary>
        /// <param name="internalPrompts">内联提示语。优先级最高
        /// <list type="bullet">
        /// <item>提示语只描述校验失败的原因，而不应该包含其他内容。（ 例如 : 不能是默认值、必须填写 等等类似的语句 )</item>
        /// <item>内联提示语将覆盖所有其他设置</item>
        /// <item>提示语优先级: <see cref="ValidateBaseAttribute.InternalPrompts"/> > <see cref="CustomPrompts.Set{T}(string)"/> > <see cref="ValidateBaseAttribute.Prompts"/></item>
        /// </list>
        /// </param>
        public EmailAttribute(string internalPrompts = null) : base(internalPrompts)
        {

        }

        public override string Prompts => Properties.Resources.EmailPrompts;

        public override string Pattern { get; protected set; } = @"[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?";
    }

    /// <summary>
    /// 属性只能是IP地址
    /// </summary>
    public sealed class IpAddressAttribute : ValidateRegexBaseAttribute
    {
        /// <summary>
        /// 属性只能是IP地址
        /// </summary>
        /// <param name="internalPrompts">内联提示语。优先级最高
        /// <list type="bullet">
        /// <item>提示语只描述校验失败的原因，而不应该包含其他内容。（ 例如 : 不能是默认值、必须填写 等等类似的语句 )</item>
        /// <item>内联提示语将覆盖所有其他设置</item>
        /// <item>提示语优先级: <see cref="ValidateBaseAttribute.InternalPrompts"/> > <see cref="CustomPrompts.Set{T}(string)"/> > <see cref="ValidateBaseAttribute.Prompts"/></item>
        /// </list>
        /// </param>
        public IpAddressAttribute(string internalPrompts = null) : base(internalPrompts)
        {

        }

        public override string Prompts => Properties.Resources.IpAddressPrompts;

        public override string Pattern { get; protected set; } = @"(?=(\b|\D))(((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))(?=(\b|\D))";

    }

    /// <summary>
    /// 属性只能是英文字母
    /// </summary>
    public sealed class AlphabetAttribute : ValidateRegexBaseAttribute
    {
        /// <summary>
        /// 属性只能是英文字母
        /// </summary>
        /// <param name="internalPrompts">内联提示语。优先级最高
        /// <list type="bullet">
        /// <item>提示语只描述校验失败的原因，而不应该包含其他内容。（ 例如 : 不能是默认值、必须填写 等等类似的语句 )</item>
        /// <item>内联提示语将覆盖所有其他设置</item>
        /// <item>提示语优先级: <see cref="ValidateBaseAttribute.InternalPrompts"/> > <see cref="CustomPrompts.Set{T}(string)"/> > <see cref="ValidateBaseAttribute.Prompts"/></item>
        /// </list>
        /// </param>
        public AlphabetAttribute(string internalPrompts = null) : base(internalPrompts)
        {

        }

        public override string Prompts => Properties.Resources.AlphabetPrompts;

        public override string Pattern { get; protected set; } = @"^[a-zA-Z]+$";
    }
}
